// 题1
function Test1() {
	function Person(name) {
        this.name = name
    }
    var p2 = new Person('king')
    console.log(p2.__proto__); // Person.prototype
    console.log(p2.__proto__.__proto__); // Object.prototype
    console.log(p2.__proto__.__proto__.__proto__); // null
    console.log(p2.constructor); // Person
    console.log(p2.prototype); // undefined
    console.log(Person.constructor); Function
    console.log(Person.prototype); 
    console.log(Person.prototype.constructor); // Person
    console.log(Person.prototype.__proto__); // Object.prototype
    console.log(Person.__proto__); // Function.prototype
    console.log(Function.prototype.__proto__); // Object.prototype
    console.log(Function.__proto__); // Function.prototype
    console.log(Object.__proto__); // Function.prototype
    console.log(Object.prototype.__proto__); // null


}
// Test1()
// 结果：
// 
/**
 * 解析：
 * 
 */

// 题2
function Foo() {
    getName = function () {
        console.log(1);
    }
    return this
}

Foo.getName = function () {
    console.log(2);
}

Foo.prototype.getName = function () {
    console.log(3);
}
var getName = function () {
    console.log(4);
}

function getName() {
    console.log(5);
}

// Foo.getName() // 2
// getName() // 4
// Foo().getName() // 1
// getName() // 1
// new Foo.getName() // 2
// new Foo().getName() // 3
// new new Foo().getName() // 3
// 结果：
// 
/**
 * 解析：
 * 
 */

// 题3
function Test3() {
	var F = function () {
        
    }
    Object.prototype.a = function () {
        console.log('a');
    }
    Function.prototype.b = function () {
        console.log('b');
    }
    var f = new F()
    f.a() // a
    f.b() // Uncaught TypeError: f.b is not a function
    F.a() // a
    F.b() // b
}
// Test3()
// 结果：
// 
/**
 * 解析：
 * f沿着原型链，F.prototype Object.prototype
 * 而构造函数F，其Function.prototype  Object.prototype
 */

// 题4
function Test4() {
	function Foo() {
        Foo.a = function () {
            console.log(1);
        }
        this.a = function () {
            console.log(2);
        }
    }
    Foo.prototype.a = function () {
        console.log(3);
    }
    Foo.a = function () {
        console.log(4);
    }
    Foo.a() // 4
    let obj = new Foo() 
    obj.a() // 2
    Foo.a() // 1
}
Test4()
// 结果：
// 
/**
 * 解析：
 * 
 */

// 题5
function Test5() {
	function Dog() {
        this.name = 'puppy'
    }
    Dog.prototype.bark = () => {
        console.log('woof!');
    }
    const dog = new Dog()
    console.log(Dog.prototype.constructor === Dog && dog.constructor === Dog &&  dog instanceof Dog)
}
Test5()
// 结果：
// true
/**
 * 解析：
 * 
 */

// 题6
function Test6() {
	var A = {n : 4399}
    var B = function () {
        this.n = 9999
    }
    var C = function () {
        var n = 8888
    }
    B.prototype = A
    C.prototype = A
    var b = new B()
    var c = new C()
    A.n++
    console.log(b.n); // 9999
    console.log(c.n); // 4400
}
Test6()
// 结果：
// 
/**
 * 解析：
 * 
 */

// 题7
function Test7() {
	function A() {
        
    }
    function B(a) {
        this.a = a
    }
    function C(a) {
        if (a) {
            this.a = a
        }
    }
    A.prototype.a = 1
    B.prototype.a = 1
    C.prototype.a = 1
    console.log(new A().a); // 1
    console.log(new B().a); // undefined
    console.log(new C(2).a); // 2
}
// Test7()
// 结果：
// 
/**
 * 解析：
 * 
 */

// 题8
function Test8() {
	function Parent() {
        this.a = 1
        this.b = [1,2,this.a]
        this.c= {demo: 5}
        this.show = function () {
            console.log(this.a, this.b, this.c.demo);
        }
    }
    function Child() {
        this.a = 2
        this.change = function () {
            this.b.push(this.a)
            this.a = this.b.length
            this.c.demo = this.a++
        }
    }
    Child.prototype = new Parent
    var parent = new Parent
    var child1 = new Child
    var child2 = new Child
    child1.a = 11
    child2.a = 12
    parent.show()
    child1.show()
    child2.show()
    child1.change()
    child2.change()
    parent.show()
    child1.show()
    child2.show() 
}
// Test8()
// 结果：
// 1 [1,2,1]  5
// 11 [1,2,1] 5
// 12 [1,2,1] 5
// 1 [1,2,1] 5 
// 5 [1,2,1,11, 12] 5
// 6 [1,2,1,11,12] 5
/**
 * 解析：
 * 
 */

// 题9
function Test9() {
	function SuperType() {
        this.property = true
    }
    SuperType.prototype.getSuperValue = function () {
        return this.property
    }
    function SubType() {
        this.subproperty = false
    }
    SubType.prototype = new SuperType
    SubType.prototype.getSubValue = function () {
        return this.subproperty
    }
    var instance = new SubType
    console.log(instance.getSuperValue());
}
Test9()
// 结果：
// 
/**
 * 解析：
 * 
 */